#include "main.h"
int main(int argc, const char *argv[])
{
	int S=0,//服务器套接字
		C[50]={0},//客户端套接字数组
		C_len=0;//数组长度
	//搭建服务器端
	//1、创建套接字
	if((S=socket(AF_INET,SOCK_STREAM,0))==-1){perror("创建套接字失败");return -1;}
	//2、绑定本机IP及端口
	struct sockaddr_in addr={0};
	addr.sin_family=AF_INET;
	addr.sin_port=htons(12345);
	addr.sin_addr.s_addr=inet_addr("127.0.0.1");
	//addr.sin_addr.s_addr=inet_addr("192.168.65.128");
	if(bind(S,(struct sockaddr*)&addr,sizeof(addr))==-1){perror("绑定失败");return -1;}
	//3、监听
	listen(S,10);
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//多路文件IO
	//准备一个可读监视列表
	fd_set readfds;
	//初始化监控列表
	FD_ZERO(&readfds);

	//将服务器加入可读监视列表
	FD_SET(S,&readfds);
	FD_SET(0,&readfds);
	//循环阻塞监视
	printf("循环阻塞等待客户端请求\n");
	while(1)
	{
		fd_set temp=readfds;//重新载入监视列表
		//监视
		select(50,&temp,NULL,NULL,NULL);
		////服务器描述符变化
		if(FD_ISSET(S,&temp))	
		{
			//struct sockaddr_in addr={0}; 
			//响应客户端连接
			int CC=accept(S,NULL,NULL);
			printf("客户端<%d>建立连接\n",C_len);
			FD_SET(CC,&readfds);//将客户端加入到监视列表
			client_add(C,&C_len,CC);//将客户端描述符加入数组
			continue;
		}
		////标准输入流描述符变化
		else if(FD_ISSET(0,&temp))
		{
			char buf[128]={0};
			scanf("%s",buf);
			while(getchar()!=10);
			printf("标准输入流：%s\n",buf);
			continue;
		}
		////客户端描述符变化
		for(int i=0;i<50;i++)//遍历查找
		{
			if(FD_ISSET(C[i],&temp))
			{
				//客户端激活
				char buf[128]={0};
				int res=read(C[i],&buf,128);
				if(res==0)//客户端断开连接
				{
					printf("客户端<%d>断开连接\n",i);
					FD_CLR(C[i],&readfds);//移除监视列表
					client_del(C,&C_len,C[i]);//移除描述符数组
					close(C[i]);
					break;
				}
				printf("客户端<%d>发来消息:%s\n",i,buf);
			}
		}

	}
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



	close(S);
	return 0;
}
